// 协议制定
// 1.协议制定好
// 2.根据协议对收到的消息做出响应
#include <iostream>
#include <string>
#include <cstring>
#include<stdlib.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include<sstream>
#include<vector>
#include"Util.hpp"
 #include <sys/types.h>
#include <sys/stat.h>


//#include <json.h>

using namespace std;

#define sep "\r\n"
#define sep_LEN strlen(sep)

const string home_page="index.html";//设置网页主页
const string html_404="wwwroot/404.html";//用于客户端发出错误请求后，给客户端的回复
const string default_root="./wwwroot";//\默认根目录

enum
{
    OK=0,
    DIV_ZERO,
    MOD_ZERO,
    OP_ERROR

};



class httpRequest
{
public:
    httpRequest(){}
    ~httpRequest(){}
    void parse()
    {
        string line=Util::getOneLine(message,sep);
        if(line.empty()) return ;
        std::stringstream ss(line);
        ss>>method>>url>>httpversion;//按空格对字符串进行分离
        //添加web默认路径，引发的思考为什么要手动设置默认路径，不是已经可以访问网站了吗
        
        path=default_root;
        path+=url;//根目录加上客户端申请的路径
        if(path[path.size()-1]=='/')
        {
            path+=home_page;//说明url只有一个\，访问根目录，因此设置指定访问路径为主页
        }
        auto pos=path.rfind(".");//找url路径下的文件类型
        if(pos==std::string::npos)//如果没有后缀，网络文件类型就为html
        {suffix =".html";}
        else
        {suffix=path.substr(pos);}//截取路径后缀

        struct stat st;//现在有了具体文件资源的路径，就可以根据路径找到文件资源，然后对获取其大小
        int n=stat(path.c_str(),&st);
        if(n==0) size=st.st_size;
        else size=-1;


    }
    
public:
    string message;//缓冲区
    // string reqline;//请求行
    // vector<string> reqheader;//请求报头
    // string body;//正文
    //请求行解析
    string method;
    string url;
    string httpversion;
    string path;//自定义路径，要根据url加上指定路径，为了访问指定目录下的文件
    string suffix;//访问文件的类型，网页、图片、视频等
    int size;//访问资源的大小
    string parm;
};

class httpResponse
{public:
    string outmessage;//存网络资源的缓冲区

};

